<?php

namespace app\api\controller;

use app\common\controller\Api;

// thinkphp
use app\common\model\Config;
use app\common\model\UserOrder;
use think\Db;

// vendor
use EasyWeChat\Factory;

// model
use app\common\model\Order;


/**
 * 支付回调
 */
class Payment extends Api
{
    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';

    /**
     * TODO
     * 测试支付回调
     *
     */
    public function test_callback()
    {
        $params['order_sn'] = $this->request->post('order_sn', '');
        if(empty($params['order_sn'])){
            $this->error("order_sn 参数错误");
        }
        // 查询对应的订单 --------------------------------------------------------------
        $Order = new Order();
        $orderData = $Order->where('order_sn', $params['order_sn'])->find();
        // 查询对应的订单 --------------------------------------------------------------

        // 处理业务 --------------------------------------------------------------------
        if ($orderData) {
            if($orderData['is_cancel'] == Order::IS_CANCEL_YES){
                $this->error("该订单已取消");
            }
            if($orderData['is_paid'] == Order::IS_PAID_PAY){
                $this->error("该订单已支付");
            }
            // 开启事务
            Db::startTrans();
            try {
                //  更新订单状态 ---------------------------------------------------------------
                Order::paySuccess($orderData, ['order_sn'=>$params['order_sn']]);
                // 提交事务
                Db::commit();
            } catch (\Exception $e) {
                // 回滚事务
                Db::rollback();
                $errorInfo = [
                    'file' => $e->getFile(),
                    'line' => $e->getLine(),
                    'message' => $e->getMessage()
                ];
                $this->error('支付失败', $errorInfo);
            }
        } else {
            // 错误消息
            $this->error('订单不存在');
        }
        // 处理业务 --------------------------------------------------------------------
        $this->success("支付回调成功");
    }
    /**
     * 微信支付回调
     *
     */
    public function wechat_callback()
    {
        $config = [
            // 必要配置
            'app_id'             => Config::getConfigValue('miniapp_wechat_appid'),
            'mch_id'             => Config::getConfigValue('payment_wechat_mchid'), // 商户号
            'key'                => Config::getConfigValue('payment_wechat_mchsecret'), // API 密钥
            // 如需使用敏感接口（如退款、发送红包等）需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'          => '', // XXX: 绝对路径！！！！
            'key_path'           => '',      // XXX: 绝对路径！！！！
        ];

        $app = Factory::payment($config);
        $response = $app->handlePaidNotify(function ($message, $fail) {
            //\think\Log::record("支付回调 微信返回参数");
            //\think\Log::record($message);
            // 查询对应的订单 --------------------------------------------------------------
            $Order = new Order();
            $orderData = $Order->where('order_sn', $message['out_trade_no'])->find();
            // 查询对应的订单 --------------------------------------------------------------

            // 处理业务 --------------------------------------------------------------------
            if ($orderData) {
                // 开启事务
                Db::startTrans();
                try {
                    //  更新订单状态 ---------------------------------------------------------------
                    Order::paySuccess($orderData, $message);
                    // TODO 微信分账  分账表
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    $errorInfo = [
                        'file' => $e->getFile(),
                        'line' => $e->getLine(),
                        'message' => $e->getMessage()
                    ];
                    \think\Log::error($errorInfo);
                    $fail('支付失败');
                }
            } else {
                // 错误消息
                $fail('订单不存在');
            }
            // 处理业务 --------------------------------------------------------------------
            return true;
        });

        $response->send(); // Laravel 里请使用：return $response;
    }

    /**
     * 支付宝支付回调
     *
     */
    public function alipay_callback()
    {
    }

    /**
     * QQ回调(暂时先放这里先)
     *
     */
    public function qq_callback()
    {
    }
}
